From 2210b9a30254b4e1c648a4c7cf3333bab34b00c9 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Tue, 24 Apr 2018 21:32:36 +0200 Subject: [PATCH] gtk-demo: Merge widgetbowl into fishbowl --- demos/gtk-demo/demo.gresource.xml | 1 - demos/gtk-demo/fishbowl.c | 190 +++++++++++++++++++++- demos/gtk-demo/fishbowl.ui | 19 +++ demos/gtk-demo/gtkfishbowl.c | 3 +- demos/gtk-demo/meson.build | 1 - demos/gtk-demo/widgetbowl.c | 261 ------------------------------ 6 files changed, 210 insertions(+), 265 deletions(-) delete mode 100644 demos/gtk-demo/widgetbowl.c diff --git a/demos/gtk-demo/demo.gresource.xml b/demos/gtk-demo/demo.gresource.xml index a4f5f0fe44..0b6952d237 100644 --- a/demos/gtk-demo/demo.gresource.xml +++ b/demos/gtk-demo/demo.gresource.xml @@ -160,7 +160,6 @@ expander.c filtermodel.c fishbowl.c - widgetbowl.c flowbox.c foreigndrawing.c font_features.c diff --git a/demos/gtk-demo/fishbowl.c b/demos/gtk-demo/fishbowl.c index fc41049415..5c0272707d 100644 --- a/demos/gtk-demo/fishbowl.c +++ b/demos/gtk-demo/fishbowl.c @@ -8,6 +8,13 @@ #include #include "gtkfishbowl.h" +#include "gtkgears.h" + +const char *const css = +".blurred-button {" +" box-shadow: 0px 0px 5px 10px rgba(0, 0, 0, 0.5);" +"}" +""; char **icon_names = NULL; gsize n_icon_names = 0; @@ -59,10 +66,187 @@ create_icon (void) return image; } +static GtkWidget * +create_button (void) +{ + return gtk_button_new_with_label ("Button"); +} + +static GtkWidget * +create_blurred_button (void) +{ + GtkWidget *w = gtk_button_new (); + + gtk_style_context_add_class (gtk_widget_get_style_context (w), "blurred-button"); + + return w; +} + +static GtkWidget * +create_font_button (void) +{ + return gtk_font_button_new (); +} + +static GtkWidget * +create_level_bar (void) +{ + GtkWidget *w = gtk_level_bar_new_for_interval (0, 100); + + gtk_level_bar_set_value (GTK_LEVEL_BAR (w), 50); + + /* Force them to be a bit larger */ + gtk_widget_set_size_request (w, 200, -1); + + return w; +} + +static GtkWidget * +create_spinner (void) +{ + GtkWidget *w = gtk_spinner_new (); + + gtk_spinner_start (GTK_SPINNER (w)); + + return w; +} + +static GtkWidget * +create_spinbutton (void) +{ + GtkWidget *w = gtk_spin_button_new_with_range (0, 10, 1); + + return w; +} + +static GtkWidget * +create_label (void) +{ + GtkWidget *w = gtk_label_new ("pLorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua."); + + gtk_label_set_line_wrap (GTK_LABEL (w), TRUE); + gtk_label_set_max_width_chars (GTK_LABEL (w), 100); + + return w; +} + +static GtkWidget * +create_video (void) +{ + GtkMediaStream *stream = gtk_media_file_new_for_resource ("/images/gtk-logo.webm"); + GtkWidget *w = gtk_image_new_from_paintable (GDK_PAINTABLE (stream)); + gtk_media_stream_set_loop (stream, TRUE); + gtk_media_stream_play (stream); + g_object_unref (stream); + + return w; +} + +static GtkWidget * +create_gears (void) +{ + GtkWidget *w = gtk_gears_new (); + + gtk_widget_set_size_request (w, 100, 100); + + return w; +} + +static GtkWidget * +create_switch (void) +{ + GtkWidget *w = gtk_switch_new (); + + gtk_switch_set_state (GTK_SWITCH (w), TRUE); + + return w; +} + +static const struct { + const char *name; + GtkWidget * (*create_func) (void); +} widget_types[] = { + { "Icon", create_icon }, + { "Button", create_button }, + { "Blurbutton", create_blurred_button }, + { "Fontbutton", create_font_button }, + { "Levelbar", create_level_bar }, + { "Label", create_label }, + { "Spinner", create_spinner }, + { "Spinbutton", create_spinbutton }, + { "Video", create_video }, + { "Gears", create_gears }, + { "Switch", create_switch }, +}; + +static int selected_widget_type = -1; +static const int N_WIDGET_TYPES = G_N_ELEMENTS (widget_types); + +static void +set_widget_type (GtkFishbowl *fishbowl, + int widget_type_index) +{ + GtkWidget *window, *headerbar; + + if (widget_type_index == selected_widget_type) + return; + + selected_widget_type = widget_type_index; + + gtk_fishbowl_set_creation_func (fishbowl, + widget_types[selected_widget_type].create_func); + + window = gtk_widget_get_toplevel (GTK_WIDGET (fishbowl)); + headerbar = gtk_window_get_titlebar (GTK_WINDOW (window)); + gtk_header_bar_set_title (GTK_HEADER_BAR (headerbar), + widget_types[selected_widget_type].name); +} + +void +next_button_clicked_cb (GtkButton *source, + gpointer user_data) +{ + GtkFishbowl *fishbowl = user_data; + int new_index; + + if (selected_widget_type + 1 >= N_WIDGET_TYPES) + new_index = 0; + else + new_index = selected_widget_type + 1; + + set_widget_type (fishbowl, new_index); +} + +void +prev_button_clicked_cb (GtkButton *source, + gpointer user_data) +{ + GtkFishbowl *fishbowl = user_data; + int new_index; + + if (selected_widget_type - 1 < 0) + new_index = N_WIDGET_TYPES - 1; + else + new_index = selected_widget_type - 1; + + set_widget_type (fishbowl, new_index); +} + + GtkWidget * do_fishbowl (GtkWidget *do_widget) { static GtkWidget *window = NULL; + static GtkCssProvider *provider = NULL; + + if (provider == NULL) + { + provider = gtk_css_provider_new (); + gtk_css_provider_load_from_data (provider, css, -1); + gtk_style_context_add_provider_for_display (gdk_display_get_default (), + GTK_STYLE_PROVIDER (provider), + GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); + } if (!window) { @@ -72,10 +256,14 @@ do_fishbowl (GtkWidget *do_widget) g_type_ensure (GTK_TYPE_FISHBOWL); builder = gtk_builder_new_from_resource ("/fishbowl/fishbowl.ui"); + gtk_builder_add_callback_symbols (builder, + "next_button_clicked_cb", G_CALLBACK (next_button_clicked_cb), + "prev_button_clicked_cb", G_CALLBACK (prev_button_clicked_cb), + NULL); gtk_builder_connect_signals (builder, NULL); window = GTK_WIDGET (gtk_builder_get_object (builder, "window")); bowl = GTK_WIDGET (gtk_builder_get_object (builder, "bowl")); - gtk_fishbowl_set_creation_func (GTK_FISHBOWL (bowl), create_icon); + set_widget_type (GTK_FISHBOWL (bowl), 0); gtk_window_set_display (GTK_WINDOW (window), gtk_widget_get_display (do_widget)); g_signal_connect (window, "destroy", diff --git a/demos/gtk-demo/fishbowl.ui b/demos/gtk-demo/fishbowl.ui index 5cd82a6648..973d9745ae 100644 --- a/demos/gtk-demo/fishbowl.ui +++ b/demos/gtk-demo/fishbowl.ui @@ -6,6 +6,25 @@ 1 + + + + + + pan-start-symbolic + + + + + + pan-end-symbolic + + + + + fps diff --git a/demos/gtk-demo/gtkfishbowl.c b/demos/gtk-demo/gtkfishbowl.c index 9477f7e4e5..f29d67b064 100644 --- a/demos/gtk-demo/gtkfishbowl.c +++ b/demos/gtk-demo/gtkfishbowl.c @@ -523,7 +523,7 @@ gtk_fishbowl_do_update (GtkFishbowl *fishbowl) priv->last_benchmark_change = 0; } - gtk_fishbowl_set_count (fishbowl, MAX (1, priv->count + priv->last_benchmark_change)); + gtk_fishbowl_set_count (fishbowl, MAX (1, (int) priv->count + priv->last_benchmark_change)); } static gboolean @@ -652,6 +652,7 @@ gtk_fishbowl_set_creation_func (GtkFishbowl *fishbowl, g_object_freeze_notify (G_OBJECT (fishbowl)); gtk_fishbowl_set_count (fishbowl, 0); + priv->last_benchmark_change = 0; priv->creation_func = creation_func; diff --git a/demos/gtk-demo/meson.build b/demos/gtk-demo/meson.build index 67791355c6..06e8b7f502 100644 --- a/demos/gtk-demo/meson.build +++ b/demos/gtk-demo/meson.build @@ -26,7 +26,6 @@ demos = files([ 'expander.c', 'filtermodel.c', 'fishbowl.c', - 'widgetbowl.c', 'foreigndrawing.c', 'gestures.c', 'glarea.c', diff --git a/demos/gtk-demo/widgetbowl.c b/demos/gtk-demo/widgetbowl.c deleted file mode 100644 index 63369efbd6..0000000000 --- a/demos/gtk-demo/widgetbowl.c +++ /dev/null @@ -1,261 +0,0 @@ -/* Benchmark/Widgetbowl - * - * This is a version of the Fishbowl demo that instead shows different - * kinds of widgets, which is useful for comparing the rendering performance - * of theme specifics. - */ - -#include - -#include "gtkfishbowl.h" -#include "gtkgears.h" - -const char *const css = -".blurred-button {" -" box-shadow: 0px 0px 5px 10px rgba(0, 0, 0, 0.5);" -"}" -""; - -GtkWidget *fishbowl; - -static GtkWidget * -create_button (void) -{ - return gtk_button_new_with_label ("Button"); -} -static GtkWidget * -create_blurred_button (void) -{ - GtkWidget *w = gtk_button_new (); - - gtk_style_context_add_class (gtk_widget_get_style_context (w), "blurred-button"); - - return w; -} - -static GtkWidget * -create_font_button (void) -{ - return gtk_font_button_new (); -} - -static GtkWidget * -create_level_bar (void) -{ - GtkWidget *w = gtk_level_bar_new_for_interval (0, 100); - - gtk_level_bar_set_value (GTK_LEVEL_BAR (w), 50); - - /* Force them to be a bit larger */ - gtk_widget_set_size_request (w, 200, -1); - - return w; -} - -static GtkWidget * -create_spinner (void) -{ - GtkWidget *w = gtk_spinner_new (); - - gtk_spinner_start (GTK_SPINNER (w)); - - return w; -} - -static GtkWidget * -create_spinbutton (void) -{ - GtkWidget *w = gtk_spin_button_new_with_range (0, 10, 1); - - return w; -} - -static GtkWidget * -create_label (void) -{ - GtkWidget *w = gtk_label_new ("pLorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua."); - - gtk_label_set_line_wrap (GTK_LABEL (w), TRUE); - gtk_label_set_max_width_chars (GTK_LABEL (w), 100); - - return w; -} - -static GtkWidget * -create_video (void) -{ - GtkMediaStream *stream = gtk_media_file_new_for_resource ("/images/gtk-logo.webm"); - GtkWidget *w = gtk_image_new_from_paintable (GDK_PAINTABLE (stream)); - gtk_media_stream_set_loop (stream, TRUE); - gtk_media_stream_play (stream); - g_object_unref (stream); - - return w; -} - -static GtkWidget * -create_gears (void) -{ - GtkWidget *w = gtk_gears_new (); - - gtk_widget_set_size_request (w, 100, 100); - - return w; -} - -static GtkWidget * -create_switch (void) -{ - GtkWidget *w = gtk_switch_new (); - - gtk_switch_set_state (GTK_SWITCH (w), TRUE); - - return w; -} - -static const struct { - const char *name; - GtkWidget * (*create_func) (void); -} widget_types[] = { - { "Button", create_button }, - { "Blurbutton", create_blurred_button }, - { "Fontbutton", create_font_button }, - { "Levelbar" , create_level_bar }, - { "Label" , create_label }, - { "Spinner" , create_spinner }, - { "Spinbutton", create_spinbutton }, - { "Video", create_video }, - { "Gears", create_gears }, - { "Switch", create_switch }, -}; - -static int selected_widget_type = -1; -static const int N_WIDGET_TYPES = G_N_ELEMENTS (widget_types); - -#define N_STATS 5 - -#define STATS_UPDATE_TIME G_USEC_PER_SEC - -static void -set_widget_type (GtkWidget *headerbar, - int widget_type_index) -{ - if (widget_type_index == selected_widget_type) - return; - - selected_widget_type = widget_type_index; - - gtk_header_bar_set_title (GTK_HEADER_BAR (headerbar), - widget_types[selected_widget_type].name); - gtk_fishbowl_set_creation_func (GTK_FISHBOWL (fishbowl), - widget_types[selected_widget_type].create_func); -} - -static void -next_button_clicked_cb (GtkButton *source, - gpointer user_data) -{ - GtkWidget *headerbar = user_data; - int new_index; - - if (selected_widget_type + 1 >= N_WIDGET_TYPES) - new_index = 0; - else - new_index = selected_widget_type + 1; - - set_widget_type (headerbar, new_index); -} - -static void -prev_button_clicked_cb (GtkButton *source, - gpointer user_data) -{ - GtkWidget *headerbar = user_data; - int new_index; - - if (selected_widget_type - 1 < 0) - new_index = N_WIDGET_TYPES - 1; - else - new_index = selected_widget_type - 1; - - set_widget_type (headerbar, new_index); -} - -GtkWidget * -do_widgetbowl (GtkWidget *do_widget) -{ - static GtkWidget *window = NULL; - static GtkCssProvider *provider = NULL; - - gtk_init (); - - if (provider == NULL) - { - provider = gtk_css_provider_new (); - gtk_css_provider_load_from_data (provider, css, -1); - gtk_style_context_add_provider_for_display (gdk_display_get_default (), - GTK_STYLE_PROVIDER (provider), - GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); - } - - if (!window) - { - GtkWidget *info_label; - GtkWidget *count_label; - GtkWidget *titlebar; - GtkWidget *title_box; - GtkWidget *left_box; - GtkWidget *next_button; - GtkWidget *prev_button; - - window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - titlebar = gtk_header_bar_new (); - gtk_header_bar_set_show_title_buttons (GTK_HEADER_BAR (titlebar), TRUE); - info_label = gtk_label_new ("widget - 00.0 fps"); - count_label = gtk_label_new ("0"); - fishbowl = gtk_fishbowl_new (); - title_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6); - prev_button = gtk_button_new_from_icon_name ("pan-start-symbolic"); - next_button = gtk_button_new_from_icon_name ("pan-end-symbolic"); - left_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); - - g_object_bind_property (fishbowl, "count", count_label, "label", 0); - g_signal_connect (next_button, "clicked", G_CALLBACK (next_button_clicked_cb), titlebar); - g_signal_connect (prev_button, "clicked", G_CALLBACK (prev_button_clicked_cb), titlebar); - - gtk_fishbowl_set_animating (GTK_FISHBOWL (fishbowl), TRUE); - gtk_fishbowl_set_benchmark (GTK_FISHBOWL (fishbowl), TRUE); - - gtk_widget_set_hexpand (title_box, TRUE); - gtk_widget_set_halign (title_box, GTK_ALIGN_END); - - gtk_window_set_titlebar (GTK_WINDOW (window), titlebar); - gtk_container_add (GTK_CONTAINER (title_box), count_label); - gtk_container_add (GTK_CONTAINER (title_box), info_label); - gtk_header_bar_pack_end (GTK_HEADER_BAR (titlebar), title_box); - gtk_container_add (GTK_CONTAINER (window), fishbowl); - - - gtk_style_context_add_class (gtk_widget_get_style_context (left_box), "linked"); - gtk_container_add (GTK_CONTAINER (left_box), prev_button); - gtk_container_add (GTK_CONTAINER (left_box), next_button); - gtk_header_bar_pack_start (GTK_HEADER_BAR (titlebar), left_box); - - gtk_window_set_display (GTK_WINDOW (window), - gtk_widget_get_display (do_widget)); - g_signal_connect (window, "destroy", - G_CALLBACK (gtk_widget_destroyed), &window); - - gtk_widget_realize (window); - - set_widget_type (titlebar, 0); - } - - if (!gtk_widget_get_visible (window)) - gtk_widget_show (window); - else - gtk_widget_destroy (window); - - - return window; -} -- 2.30.2